# coding=utf-8
from common.assert_operator import Pact, list_each_equal, two_array_list_contains, dict_assert,string_assert
from common.utils import Utils
from common.db import sql, sqlserver_query_return_contain_field

execute_sql = sql()  # sql集合
utils = Utils()  # 扩展类
pact = Pact()  # 契约校验类
string_assert = string_assert() # 字符串校验类


class Verification:

    def after_approve(self, process_name, approve_response,
                      expect, contract_format='', db_node_verify='', message_log_verify='', db_extend_node_verify='',
                      todo_list='', confirm_path_resp=None, confirm_path_verify='',resp_body=''):
        """
        校验审批后的响应返回，数据库主节点，消息表，扩展节点表，待办列表，确认路径等校验
        :param process_name:
        :param approve_response:
        :param expect: yml数据中的预期结果列表
        :param contract_format: 契约格式
        :param db_node_verify:  yml数据中的预期结果列表中的key，如：主节点校验
        :param message_log_verify: yml数据中的预期结果列表中的key，如：消息校验
        :param db_extend_node_verify:   yml数据中的预期结果列表中的key，如：扩展节点校验
        :param todo_list:   yml数据中的预期结果列表中的key，如：回后待办列表校验
        :param confirm_path_resp:   确认路径响应
        :param confirm_path_verify: yml数据中的预期结果列表中的key，如：确认路径校验
        :param resp_body: yml数据中的预期结果列表中的key，如：传阅响应校验
        :return:
        """
        # ************************主节点校验************************
        # query_all_node_sql = execute_sql.approve_query_master_nodes(process_name)  # 查询审批后的责任人和步骤节点信息
        if db_node_verify != '':
            query_all_node_sql = execute_sql.query_node_sql_by(process_name=process_name)  # 查询审批后的责任人和步骤节点信息
            node_result = utils.query_until_all_matched(query_all_node_sql, expect[db_node_verify], 3,
                                                        query_alias=db_node_verify)  # 查询交办后流程节点信息
            # list_each_equal(expect[db_node_verify], node_result)
            two_array_list_contains(expect[db_node_verify], node_result)
        # ************************扩展节点校验************************
        if db_extend_node_verify != '':
            query_all_extend_node_sql = execute_sql.query_node_sql_by(process_name=process_name, task_table=False)  # 查询审批后的责任人和步骤节点信息
            # query_all_extend_node_sql = execute_sql.approve_query_master_nodes(process_name,
            #                                                                    "WfExtTasks")  # 查询审批后的责任人和步骤节点信息
            node_result = utils.query_until_all_matched(query_all_extend_node_sql, expect[db_extend_node_verify], 1,
                                                        query_alias=db_extend_node_verify)  # 查询交办后流程节点信息
            # node_result = sqlserver_query_return_contain_field(query_all_extend_node_sql, db_extend_node_verify)
            two_array_list_contains(expect[db_extend_node_verify], node_result)
        # ************************审批响应契约格式校验************************
        if contract_format != '':
            string_assert.eq(approve_response.status_code, 200)
            pact.pact_verify(contract_format, approve_response.json())
        # ************************消息校验************************
        if message_log_verify != '':
            message_result_sql = execute_sql.WfMessageLog_query_sql(process_name=process_name)  # 查询消息结果sql
            message_result = utils.query_until_all_matched(message_result_sql, expect[message_log_verify], 15,
                                                           query_alias=message_log_verify,by_length=True)  # 查询消息结果，最多结果与预期不等，间隔1秒，循环查询5次
            # message_result = sqlserver_query_return_contain_field(message_result_sql, message_log_verify)  # 查询消息结果
            two_array_list_contains(expect[message_log_verify], message_result)  # 消息校验
        # ************************待办列表校验************************
        if todo_list !='':
            sql = execute_sql.query_Todo(process_name)  # 查询审批后的我办理的流程-待办列表的校验
            Todo_result = utils.query_until_all_matched(sql, expect[todo_list], 3, query_alias=todo_list)
            list_each_equal(expect[todo_list], Todo_result)
        # ************************确认路径校验************************
        if confirm_path_resp != None:
            path = utils.pack_confirm_steps_field(confirm_path_resp.json())
            dict_assert(expect[confirm_path_verify], path)  # 审批确认路径校验
        # ************************响应body校验************************
        if resp_body != '':
            string_assert.eq(approve_response.status_code, 200)
            text = approve_response.json()
            dict_assert(expect[resp_body], text)  # 响应body校验，一般用于异常返回响应的校验，契约校验和此校验用其中一个即可。

    def after_end(self, process_name, approve_response,
                  expect, contract_format='', db_node_verify='', message_log_verify='', db_extend_node_verify=''):
        """
        校验结束流程后的响应返回，数据库主节点，消息表，扩展节点表
        :param process_name: 流程名称
        :param approve_response: 请求响应
        :param expect: yml数据中的预期结果列表
        :param contract_format: 契约格式
        :param db_node_verify: yml数据中的预期结果列表中的key，如：主节点校验
        :param message_log_verify: yml数据中的预期结果列表中的key，如：消息校验
        :param db_extend_node_verify: yml数据中的预期结果列表中的key，如：扩展节点校验
        :return:
        """
        # ************************结束后历史表主节点校验************************
        if db_node_verify != '':
            query_all_node_sql = execute_sql.query_node_sql_by(process_name=process_name, task_table=True,
                                                               history=True)  # 查询审批后的责任人和步骤节点信息
            node_result = utils.query_until_all_matched(query_all_node_sql, expect[db_node_verify], 3,
                                                        query_alias=db_node_verify)  # 查询交办后流程节点信息
            list_each_equal(expect[db_node_verify], node_result)
        # ************************结束后历史扩展节点校验************************
        if db_extend_node_verify != '':
            query_all_extend_node_sql = execute_sql.query_node_sql_by(process_name=process_name, task_table=False, history=True)   # 查询审批后的责任人和步骤节点信息
            node_result = utils.query_until_all_matched(query_all_extend_node_sql, expect[db_extend_node_verify], 1,
                                                        query_alias=db_extend_node_verify)  # 查询交办后流程节点信息
            # node_result = sqlserver_query_return_contain_field(query_all_extend_node_sql, db_extend_node_verify)
            two_array_list_contains(expect[db_extend_node_verify], node_result)
        # ************************审批响应契约格式校验************************
        if contract_format != '':
            pact.pact_verify(contract_format, approve_response.json())
        # ************************消息校验************************
        if message_log_verify != '':
            message_result_sql = execute_sql.WfMessageLog_query_sql(process_name=process_name)
            # message_result = sqlserver_query_return_contain_field(
            #     execute_sql.WfMessageLog_query_sql(process_name=process_name), message_log_verify)  # 查询消息结果
            message_result = utils.query_until_all_matched(message_result_sql, expect[message_log_verify], 15,
                                                           query_alias=message_log_verify,by_length=True)  # 查询消息结果，最多结果与预期不等，间隔1秒，循环查询5次
            two_array_list_contains(expect[message_log_verify], message_result)  # 消息校验
